#ifndef __HEAP_H
#define __HEAP_H
#include <stdint.h>
#include "user_bsp_cfg.h"

#ifndef NULL
#define NULL 0
#endif

#if HEAP_USE_EXSRAM
    /* 内存池处于外部SRAM里面*/
    #define EXSRAM_BLOCK_SIZE 32                                    /*内存块大小为32字节*/
    #define EXSRAM_MAX_SIZE 960 * 1024                              /*最大管理内存960K*/
    #define EXSRAM_ALLOC_TABLE_SIZE EXSRAM_MAX_SIZE / EXSRAM_BLOCK_SIZE /*内存表大小*/
#endif
/* 用于管理CCM(特别注意,这部分SRAM,仅CPU可以访问!!)*/
#define CCM_BLOCK_SIZE 32                                    /*内存块大小为32字节*/
#define CCM_MAX_SIZE 60 * 1024                               /*最大管理内存60K*/
#define CCM_ALLOC_TABLE_SIZE CCM_MAX_SIZE / CCM_BLOCK_SIZE /*内存表大小*/

typedef enum heap_index
{
    hpidx_ccm = 0, /* CCM RAM堆内存 偏移ID */
#if HEAP_USE_EXSRAM
    hpidx_exsram,  /* EXTERN SRAM 堆内存 偏移ID */
#endif
    hpidx_max      /* 堆内存 偏移ID边界 */
} heap_index_t;
typedef struct heap_dev
{
    uint8_t *rambase;  /* 堆内存基地址 */
    uint8_t *mapbase; /* 堆内存映射表基地址 */
    uint32_t blksize;  /* 内存块大小字节数 */
    uint32_t ramsize;  /* 最大管理内存字节数 */
    uint32_t mapsize;  /* 内存表大小 */
    uint32_t ready;    /* 初始化标志 0 未初始化 1 已初始化 */
} heap_dev_t, *heap_dev_ptr;

uint16_t my_mem_perused(heap_index_t idx);                    /*获得内存使用率(外/内部调用)*/
void my_free(heap_index_t idx, void *ptr);                    /*内存释放(外部调用)*/
void *my_malloc(heap_index_t idx, uint32_t size);             /*内存分配(外部调用)*/
void *my_realloc(heap_index_t idx, void *ptr, uint32_t size); /*重新分配内存(外部调用)*/

void * ccm_malloc(uint32_t size);
void ccm_free(void*ptr);
void * ccm_realloc(void *ptr,uint32_t size);
uint16_t ccm_perused(void);

#if HEAP_USE_EXSRAM
void * exsram_malloc(uint32_t size);
void exsram_free(void*ptr);
void * exsram_realloc(void *ptr,uint32_t size);
uint16_t exsram_perused(void);
#endif

#endif
